// 6-7 长整数转化成16进制字符串 (10分)
// 本题要求实现一个将长整数转化成16进制字符串的简单函数。

// 函数接口定义：
// void f( long int x, char *p );
// 其中x是待转化的十进制长整数，p指向某个字符数组的首元素。函数f的功能是把转换所得的16进制字符串写入p所指向的数组。16进制的A~F为大写字母。

// 裁判测试程序样例：
#include <stdio.h>
#define MAXN 10

void f(long int x, char *p);

int main()
{
    long int x;
    char s[MAXN] = "";

    scanf("%ld", &x);
    f(x, s);
    printf("%s\n", s);

    return 0;
}

// void f(long int x, char *p)
// {
//     int n, i = 0, len = 0;
//     char temp;
//     if (x == 0)
//     {
//         p[0] = '0';
//     }
//     else if (x > 0)
//     {
//         while (x)
//         {
//             n = x % 16;
//             if (n >= 0 && n <= 9)
//             {
//                 p[i] = n + '0';
//             }
//             else
//             {
//                 p[i] = n - 10 + 'A';
//             }
//             i++;
//             x /= 16;
//         }
//     }
//     else
//     {
//         x = -x;
//         while (x)
//         {
//             n = x % 16;
//             if (n >= 0 && n <= 9)
//             {
//                 p[i] = n + '0';
//             }
//             else
//             {
//                 p[i] = n - 10 + 'A';
//             }
//             i++;
//             x /= 16;
//         }
//         p[i] = '-';
//     }
//     // 计算字符串长度
//     while (p[len])
//     {
//         len++;
//     }
//     // 逆序
//     for (int idx = 0; idx < len / 2; idx++)
//     {
//         temp = p[idx];
//         p[idx] = p[len - 1 - idx];
//         p[len - 1 - idx] = temp;
//     }
// }

// 递归实现
void f(long int x, char *p)
{
    static int i = 0;
    int n;
    if (x < 0 && i == 0)
    {
        x = -x;
        p[i++] = '-';
    }
    if (x/16)
    {
        f(x/16, p);
        i++;
    }

    n = x % 16;
    if (n >= 0 && n <= 9)
    {
        p[i] = n + '0';
    }
    else
    {
        p[i] = n - 10 + 'A';
    }
}
// 输入样例1：
// 123456789
// 输出样例1：
// 75BCD15
// 输入样例2：
// -125
// 输出样例2：
// -7D